/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entidade;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author asouza
 */
public class Projeto {

    List<Gerente> listGer;
    Programador[][] matriz;
    int tamanhoPop = 10;
    int tamanhoBit = 10;
    List<Double> listaFitness = new ArrayList<Double>();

    public Projeto() {
        matriz = new Programador[tamanhoPop][tamanhoBit];

        System.out.println(escreve());
        for (int i = 0; i < 1000000; i++) {
            torneio();
        }
    }

    public void populaMatriz() {
        int numeroProj = randomDecimal();
    }

    public int randomDecimal() {
        return (int) (Math.random() * 10);
    }

    public int randomWalk() {
        return Math.random() > 0.5 ? 1 : -1;
    }

    public int calculaFitness(int linha, int coluna) {
        List<Integer> numProject = matriz[coluna][linha].getProjeto();
        if (matriz[coluna][linha].isGerente()) {
            return 0;
        } else {
            for (int i = 0; i < tamanhoPop; i++) {
                for (int j = 0; j < tamanhoBit; j++) {
                    if (matriz[i][j] != null) {
                        if (matriz[i][j].isGerente()) {
                            boolean projetoIgual = false;
                            for (Integer projeto : numProject) {
                                for (Integer auxProj : numProject) {
                                    if (auxProj == projeto) {
                                        projetoIgual = true;
                                    }
                                }
                            }
                            if (projetoIgual) {
                                int difColuna = (coluna - i);
                                int difLinha = (linha - j);
                                if (difColuna < 0) {
                                    difColuna = difColuna * (-1);
                                }
                                if (difLinha < 0) {
                                    difLinha = difLinha * (-1);
                                }
                                return difColuna * difLinha;
                            }
                        }
                    }
                }
            }
        }
        return 0;
    }

    public void torneio() {
        int c1 = 0, l1 = 0, c2 = 0, l2 = 0, c3 = 0, l3 = 0;
        do {
            c1 = randomDecimal();
            l1 = randomDecimal();
        } while (matriz[c1][l1] == null);
        do {
            c2 = randomDecimal();
            l2 = randomDecimal();
        } while (matriz[c2][l2] == null);
        do {
            c3 = randomDecimal();
            l3 = randomDecimal();
        } while (matriz[c3][l3] == null);

        double f1 = calculaFitness(l1, c1);
        listaFitness.add(f1);
        double f2 = calculaFitness(l2, c2);
        listaFitness.add(f2);
        double f3 = calculaFitness(l3, c3);
        listaFitness.add(f2);
        if (f1 <= f2 && f1 <= f3) {
            if (f2 > 1) {
                walk(l2, c2);
            }
            if (f3 > 1) {
                walk(l3, c3);
            }
        } else if (f2 < f3) {
            if (f1 > 1) {
                walk(l1, c1);
            }
            if (f3 > 1) {
                walk(l3, c3);
            }
        } else {
            if (f1 > 1) {
                walk(l1, c1);
            }
            if (f2 > 1) {
                walk(l2, c2);
            }
        }
    }

    public void insereProgramador(Programador p) {
        int linha = 0, coluna = 0;
        do {
            linha = randomDecimal();
            coluna = randomDecimal();

        } while (matriz[coluna][linha] != null);
        matriz[coluna][linha] = p;
    }

    public String escreve() {
        String str = "";
        for (int i = 0; i < tamanhoPop; i++) {
            for (int j = 0; j < tamanhoBit; j++) {
                if (matriz[i][j] == null) {
                    str += "*\t";
                } else if (matriz[i][j].isGerente()) {
                    str += "G" + matriz[i][j].getProjeto() + "\t";
                } else {
                    str += "P" + matriz[i][j].getProjeto() + "\t";
                }
            }
            str += "\n";
        }
        return str;
    }

    public void walk(int linha, int coluna) {
        int auxLinha = linha;
        int auxColuna = coluna;
        do {
            linha = linha + randomWalk();
            coluna = coluna + randomWalk();
            if (linha < 0) {
                linha = 1;
            } else if (linha > 9) {
                linha = 8;
            }
            if (coluna < 0) {
                coluna = 1;
            } else if (coluna > 9) {
                coluna = 8;
            }
        } while (matriz[coluna][linha] != null);
        matriz[coluna][linha] = matriz[auxColuna][auxLinha];
        matriz[auxColuna][auxLinha] = null;
    }
}
